// Enumerations (枚举) 示例
// 演示 Pascal 中枚举的各种用法
program p_19_enumerations;

{$mode objfpc}{$H+}
// {$mode objfpc} 启用 Object Pascal 模式
// {$H+} 启用长字符串支持（AnsiString）

// 引入单元文件
uses
  SysUtils;  // 系统工具单元，包含常用的系统函数

// 定义枚举类型
type
  // 颜色枚举
  TColor = (Red, Green, Blue, Yellow, Purple, Orange);
  
  // 星期枚举
  TDay = (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday);
  
  // 状态枚举
  TStatus = (Inactive, Active, Suspended, Deleted);

// 获取颜色名称的函数
function GetColorName(color: TColor): String;
begin
  case color of
    Red: GetColorName := '红色';
    Green: GetColorName := '绿色';
    Blue: GetColorName := '蓝色';
    Yellow: GetColorName := '黄色';
    Purple: GetColorName := '紫色';
    Orange: GetColorName := '橙色';
  end;
end;

// 获取星期名称的函数
function GetDayName(day: TDay): String;
begin
  case day of
    Monday: GetDayName := '星期一';
    Tuesday: GetDayName := '星期二';
    Wednesday: GetDayName := '星期三';
    Thursday: GetDayName := '星期四';
    Friday: GetDayName := '星期五';
    Saturday: GetDayName := '星期六';
    Sunday: GetDayName := '星期日';
  end;
end;

// 所有变量声明移到这里
var
  currentColor: TColor;
  today: TDay;
  userStatus: TStatus;
  color: TColor;
  day1: TDay;
  day2: TDay;
  workDay: TDay;
  c: TColor;
  d: TDay;
  favoriteColors: array[1..3] of TColor;
  i: Integer;

// 程序主入口
begin
  WriteLn('=== Pascal 枚举示例 ===');
  WriteLn;
  
  // 1. 基本枚举使用
  WriteLn('1. 基本枚举使用:');
  currentColor := Blue;
  today := Wednesday;
  userStatus := Active;
  
  WriteLn('  当前颜色: ', GetColorName(currentColor));
  WriteLn('  今天是: ', GetDayName(today));
  WriteLn('  用户状态: ', Ord(userStatus));  // 显示枚举值的序号
  
  WriteLn;
  
  // 2. 枚举值的序号操作
  WriteLn('2. 枚举值的序号操作:');
  color := Green;
  WriteLn('  颜色: ', GetColorName(color));
  WriteLn('  序号: ', Ord(color));
  WriteLn('  前一个颜色: ', GetColorName(TColor(Pred(Ord(color)))));
  WriteLn('  后一个颜色: ', GetColorName(TColor(Succ(Ord(color)))));
  
  WriteLn;
  
  // 3. 枚举比较
  WriteLn('3. 枚举比较:');
  day1 := Monday;
  day2 := Friday;
  
  if day1 < day2 then
    WriteLn('  ', GetDayName(day1), ' 在 ', GetDayName(day2), ' 之前')
  else
    WriteLn('  ', GetDayName(day1), ' 在 ', GetDayName(day2), ' 之后');
  
  WriteLn;
  
  // 4. 枚举与case语句
  WriteLn('4. 枚举与case语句:');
  workDay := Thursday;
  case workDay of
    Monday: WriteLn('  开始新的一周');
    Tuesday, Wednesday, Thursday: WriteLn('  工作日中期');
    Friday: WriteLn('  感谢上帝，今天是星期五');
    Saturday, Sunday: WriteLn('  周末休息');
  end;
  
  WriteLn;
  
  // 5. 枚举遍历
  WriteLn('5. 枚举遍历:');
  WriteLn('  所有颜色:');
  for c := Low(TColor) to High(TColor) do
    WriteLn('    ', Ord(c), ': ', GetColorName(c));
  
  WriteLn('  工作日:');
  for d := Monday to Friday do
    WriteLn('    ', Ord(d), ': ', GetDayName(d));
  
  WriteLn;
  
  // 6. 枚举数组
  WriteLn('6. 枚举数组:');
  favoriteColors[1] := Red;
  favoriteColors[2] := Blue;
  favoriteColors[3] := Green;
  
  WriteLn('  最喜欢的颜色:');
  for i := 1 to 3 do
    WriteLn('    ', GetColorName(favoriteColors[i]));
  
  WriteLn;
  WriteLn('演示了 Pascal 中枚举的各种用法');
  
  // 等待用户按键，防止程序窗口立即关闭
  ReadLn;
end.